ESM on Deta
現状
公式には非対応
ルートの /package.json を"type": "module" にすると Bad Gateway Error
サブフォルダの package.json に {"type": "module"} を入れて CJSな /index.js から await import もだめ
動きそうに思えるが、なぜか node_modules 分が解決できない
workaround
rollup で ESMの部分だけ CJS にバンドルしてやる
これで index.js のでかさをある程度抑えられる
ただし Top-level await が依存関係のどこかにいると死ぬ
まあ rollup がエラー吐くのでわかりやすいでしょう
rollup.config.js例
code:rollup.config.js
const typescript = require("@rollup/plugin-typescript")
const { nodeResolve } = require("@rollup/plugin-node-resolve")
module.exports = {
input: "./src/index.ts",
output: {
file: "index.js",
format: "cjs",
},
plugins: [
nodeResolve({
modulesOnly: true, // only bundles ESM modules
}),
typescript(),
]
}
ところで 1ファイルにベタっとまとめるのと各モジュールに分けるのってどっちのほうがランタイムで早いんだろうね?
あと webpack と rollup ランタイムでどっちのほうが早いのかとかいろいろ気になる
esbuildで済むならそれが最善な気もするけど modulesOnly とかできなさそう (偏見) だし…
ちなみにこの状況で TypeScript の node16/nodenext module モードを使うには
TypeScript のソースのルート (例えば src/ ) に package.json を置いて
{"type": "module"} だけ書いておくとよい
ローカル開発で普通にtscで動かす場合は tsc の outDir にも同様の package.json を置く必要があるので注意
もしくは *.mts を使うのも良いかもしれないが